package pe.edu.sistemas.postgrado.samupg.domain.model;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "pregunta", catalog = "bd_samupg")
public class Pregunta implements java.io.Serializable {

    private Integer preguntaId;
    private String preguntaDescripcion;
    private transient String respuestaxUsuario;
    private List<Examen> examenes = new ArrayList<Examen>(0);
    private List<Alternativa> alternativas = new ArrayList<Alternativa>(0);

    public Pregunta() {
    }

    public Pregunta(String preguntaDescripcion, List<Examen> examens, List<Alternativa> alternativas) {
        this.preguntaDescripcion = preguntaDescripcion;
        this.examenes = examens;
        this.alternativas = alternativas;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "pregunta_id", unique = true, nullable = false)
    public Integer getPreguntaId() {
        return this.preguntaId;
    }

    public void setPreguntaId(Integer preguntaId) {
        this.preguntaId = preguntaId;
    }

    @Column(name = "pregunta_descripcion", length = 100)
    public String getPreguntaDescripcion() {
        return this.preguntaDescripcion;
    }

    public void setPreguntaDescripcion(String preguntaDescripcion) {
        this.preguntaDescripcion = preguntaDescripcion;
    }

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "examen_pregunta", catalog = "bd_samupg", joinColumns = {
        @JoinColumn(name = "ep_preg_id", nullable = false, updatable = false)}, inverseJoinColumns = {
        @JoinColumn(name = "ep_exam_id", nullable = false, updatable = false)})
    @Fetch(value = FetchMode.SUBSELECT)
    public List<Examen> getExamenes() {
        return this.examenes;
    }

    public void setExamenes(List<Examen> examenes) {
        this.examenes = examenes;
    }

    @OneToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER, mappedBy = "pregunta")
    @Fetch(value = FetchMode.SUBSELECT)
    public List<Alternativa> getAlternativas() {
        return this.alternativas;
    }

    public void setAlternativas(List<Alternativa> alternativas) {
        this.alternativas = alternativas;
    }

    @Transient
    public String getRespuestaxUsuario() {
        return respuestaxUsuario;
    }

    public void setRespuestaxUsuario(String respuestaxUsuario) {
        this.respuestaxUsuario = respuestaxUsuario;
    }
}
